package sistemadeproyectos;

/**
 * @author Giancarlo Nebiolo, 06-39965
 * @author Antonio Mundo, 06-39956
 * @author Angel Rubio, 06-40263
 * @version 2.0
 */
import java.net.*;
import java.io.*;
import java.util.*;

public class RepositorioServidor extends Thread{
    
    private ServerSocket serverSocket = null;
    private LinkedList<Repositorio_thr> repositorios = new LinkedList<Repositorio_thr>();
    private boolean continuar = true;
    
    /**
     * Nombre: die(String error)
     * Descripcion: Imprime algun mensaje de error, y termina el programa
     * @param error  mensaje de error a imprimir
     */
    public static void die(String error){
        System.err.println(error);
        System.exit(-1);
    }
      
    public void cerrar(){
        this.continuar = false;
        for(int i = 0; i < this.repositorios.size(); i++){
            this.repositorios.get(i).cerrar();
        }
        try{
            this.serverSocket.close();
        }
        catch(SocketException se){
            se.printStackTrace();
        }
        catch(IOException ioe){
            ioe.printStackTrace();
        }
    }
    
    /**
     * Funcion principal de los nodos. Se verificaran que los parametros sean introducidos correctamente,
     * leemos la biblioteca y el archivo,escuchamos las solicitudes de clientes y 
     * asignamos un hilo por cada solicitud (request) que se le haga
     * al nodo (servidor)
     * @throws IOException excepcion si ocurre un error in entrada o de salida
     */    
    public void run() {
        
        ServersConf rutas = new ServersConf();
        int puerto = rutas.getPuertoRepositorio();
        try { 
            this.serverSocket = new ServerSocket(puerto); 
        } 
        catch (IOException e){
            die("No se pudo escuchar en el puerto "+puerto+": "+e.getMessage()); 
        }

        /**Se crean hilos para atender a los clientes que se conecten*/
        while (continuar){
            try{
                Repositorio_thr llamada = new Repositorio_thr(this.serverSocket.accept());
                repositorios.add(llamada);
                llamada.start();
            }
            catch(IOException ioe){
                //System.out.println("Error en el servidor de repositorio");
            }
        }  
    }
}